// 消息订阅与发布
type BusClass = {
    emit: (name: string) => void
    on: (name: string, callback: Function) => void
}

type PramsKey = string | number | symbol

type List = {
    // 同一个事件可以有多个回调，所以用一个数组储存
    [key in PramsKey]: Array<Function>
}

class Bus implements BusClass {

    list: List
    constructor() {
        this.list = {}
    }
    
    on(name: string, callback: Function) {
        // 如果这个事件已经存在就直接使用，没有就创建一个空数组初始化
        let fn: Array<Function> = this.list[name] || []
        // 加回调加入到进去
        fn.push(callback)
        this.list[name] = fn
    }

    emit(name: string, ...args: Array<any>) {
        let eventName: Array<Function> = this.list[name]
        // 触发所有的回调并把要传的数据传入
        eventName.forEach(item => {
            item.apply(this, args)
        })
    }
}

export default new Bus()